'use strict';
const axios = require('axios')
const semver = require('semver')
const urlJoin = require('url-join')

//获取npm上包的信息(包含所有上传版本)
function getNpmInfo(npmName, registry){
  if(!npmName){
    return null
  }
  const registryUrl = registry || getDefaultRegistry();
  const npmInfoUrl = urlJoin(registryUrl,npmName);
  return axios.get(npmInfoUrl).then(response=>{
    if(response.status === 200){
      return response.data
    } else {
      return null
    }
  }).catch(err => {
    return Promise.reject(err)
  })
}

//获取npm上包的所有版本号
async function getNpmVersions(npmName, registry){
  const data = await getNpmInfo(npmName, registry)
  if(data){
    return Object.keys(data.versions);
  }else {
    return []
  }
}

//获取所有在当前版本之上的版本号
function getNpmSemverVersions(baseVersion, versions){
  //semver.satisfies() satisfies匹配符合条件的版本
  versions = versions.filter(versions =>
    semver.satisfies(versions, `^${baseVersion}`)
  ).sort((a, b) => semver.gt(b, a));
  return versions
}

async function getNpmSemverVersion(baseVersion, npmName, registry){
  const versions = await getNpmVersions(npmName, registry)
  const newVersions = getNpmSemverVersions(baseVersion, versions)
  if(newVersions && newVersions.length > 0){
    return newVersions[0]
  }
}

function getDefaultRegistry(isOriginal = false){
  return isOriginal ? 'https://registry.npmjs.org' : 'https://registry.npm.taobao.org'
}

async function getNpmLatestVersion(npmName, registry){
  const versions = await getNpmVersions(npmName, registry)
  if(versions){
    return versions.sort((a, b) => semver.gt(b, a))[0];
  }else {
    return null
  }
}

module.exports = {
  getNpmInfo,
  getNpmVersions,
  getDefaultRegistry,
  getNpmSemverVersion,
  getNpmLatestVersion
};
